package com.onemore.cc.net_frame.http;

import android.media.session.MediaSession;
import android.nfc.Tag;
import android.util.Log;
import android.widget.Toast;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.onemore.cc.net_frame.callback.HttpCallback;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * Create by lizihao
 * Desc:
 * Date: 2018/9/17
 */
public abstract class RHttpCallback<T> extends HttpCallback<T> {

    private Type type;

    public RHttpCallback() {
        Log.i("lln", "RHttpCallback");
    }

    @Override
    public T onConvert(String data) {
        /**
         * 接口响应数据格式如@Response
         * 将result转化给success
         * 这里处理通用错误
         */
        T t = null;
        Response response = new Gson().fromJson(data, Response.class);
        int code = response.getCode();
        String msg = response.getMsg();
        String result = response.getResult().toString();
        switch (code) {

            case 1001:
            case 1002:
            case 1003:
            case 1004:
            case 1005:
            case 1006:
            case 1007:
                onError(code, msg);
                break;
            default:
                if (response.isSuccess()) {//与服务器约定成功逻辑
//                    if (result == null || "".equals(result)) {
//                        t = convert(result);
//                    } else {
                        t = getGeneric(data);
//                    }
                } else {//统一为错误处理
                    onError(code, msg);
                }

                break;
        }
        return t;
    }

    /**
     * 数据转换/解析
     *
     * @param data
     * @return
     */
    public abstract T convert(String data);

    /**
     * 成功回调
     *
     * @param value
     */
    public abstract void onSuccess(T value);

    /**
     * 失败回调
     *
     * @param code
     * @param desc
     */
    public abstract void onError(int code, String desc);

    /**
     * 取消回调
     */
    public abstract void onCancel();

    /**
     * 自动解析json至回调中的JavaBean
     *
     * @param jsonData //     * @param callBack
     * @param <T>
     * @return
     */
    private <T> T getGeneric(String jsonData) {
        Gson gson = new Gson();
        //通过反射获取泛型的实例
        Type genertypt = getClass().getGenericSuperclass();//获得所有带有泛型的父类
        //判断是否带有泛型
        if (genertypt instanceof ParameterizedType) {
            //获取参数化类型的数组
            Type[] p = ((ParameterizedType) genertypt).getActualTypeArguments();
            type = p[0];
        }
        T t = gson.fromJson(jsonData, type);//通过gson转到对应的JavaBean
        Log.e("TAG", "t为空");
        return t;
    }
}
